/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.hamacekj.geometr.plugin;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;

/**
 * Nástroje pro zjednodušení práce při vytváření objektů.
 * @author hamacekh
 */
public interface IToolBox {
    
    /**
     * Vrátí pole primitivních objektů vzniklých průnikem primitivních objektů.
     * @param objects Objekty, na kterých má být proveden průnik.
     * @return Pole primitivních objektů, které jsou výsledkem průniku.
     */
    public Set<? extends PrimitiveObject> intersect(PrimitiveObject... objects);
    
    /**
     * Vrátí pole primitivních objektů vzniklé průnikem objektů.
     * @param objects Objekty, ze kterých se bude dělat průnik.
     * @return Množina primitivních objektů.
     */
    public Set<? extends PrimitiveObject> intersect(ConstructionObject... objects);
    
    /**
     * Vrátí pole primitivních objektů vzniklé průnikem objektů.
     * @param objects Objekty, ze kterých se bude dělat průnik.
     * @return Množina primitivních objektů.
     */
    public Set<? extends PrimitiveObject> intersect(ArrayList<Set<? extends PrimitiveObject>> objects);
    
    /**
     * Vytvoří nový bod ze zadaných souřadnic.
     * @param x
     * @param y
     * @return vytvořený bod.
     */
    public IPoint createPoint(double x, double y);
    
    /**
     * Vytvoří nový objekt bodu ze zadaného bodu.
     * @param p Bod, ze kterého má být objekt vytvořen.
     * @return Objekt bodu.
     */
    public IPointObject createPointObject(IPoint p);
    
    /**
     * Vytvoří nový objekt bodu ze zadaných souřadnic.
     * @param x
     * @param y
     * @return Objekt bodu.
     */
    public IPointObject createPointObject(double x, double y);
    
    /**
     * Vytvoří novou přímku procházející dvěma body.
     * @param A
     * @param B
     * @return Nová přímka.
     */
    public ILineObject createLineObject(IPoint A, IPoint B);
    
    /**
     * Vytvoří novou úsečku mězi dvěma body.
     * @param A
     * @param B
     * @return Nová úsečka.
     */
    public ISegmentObject createSegmentObject(IPoint A, IPoint B);
    
    /**
     * Vytvoří novou polopřímku pomocí dvou bodů.
     * @param A Bod počátku.
     * @param B Bod směru polopřímky.
     * @return Nová polopřímka.
     */
    public IRayObject createRayObject(IPoint A, IPoint B);
    
    /**
     * Vytvoří novou kružnici.
     * @param center Střed kružnice.
     * @param radius Poloměr kružnice.
     * @return Nová kružnice.
     */
    public ICircleObject createCircleObject(IPoint center, double radius);
    
    /**
     * Spočítá vzdálenost dvou bodů.
     * @param A První bod.
     * @param B Druhý bod.
     * @return Jejich vzdálenost.
     */
    public double distance(IPoint A, IPoint B);
    
    /**
     * Vytvoří nový objekt vykreslitelný na nákres.
     * @param label Popisek, kterým bude objekt adresován a který bude přípdaně zobrazen u objektu na nákresu.
     * @param isShown true, pokud se má popisek zobrazovat na nákresu.
     * @param primitiveObjects Set primitivních objektů, ze kterých se tento constructionObject skládá.
     * @param stepDesc Popis konstrukce patřící tomuto objektu. Bude zobrazen v seznamu kroků. Lze v něm používat zkratky viz dokumentace.
     * @return Výsledný objekt.
     */
    public ConstructionObject createConstructionObject(final String label,
            final boolean isShown,
            final Set<PrimitiveObject> primitiveObjects,
            final String stepDesc);
}
